fn main() {
    println!("Hello, world!");
    let number = 3;
    match_replace_if();
    loop_example();
    while_example();
    for_example();
    range_example();
}
// 控制流
// 1. if表达式
// · if 表达式允许你根据条件来执行不同分支代码，这个条件必须是 bool 类型
// · if 表达式中，与条件相关联的代码块叫作分支（arm）
// · 可选的，在后边可以加一个 else 表达式，或者多个 else if 表达式
// · 但是如果使用多于一个 else if 表达式时，会比较乱，建议使用 match 进行重构

fn match_replace_if() {
    let number = 10;
    if number % 3 == 0 {
        println!("number is divisible by 3");
    } else if number % 2 == 0 {
        println!("number is divisible by 2");
    } else if number % 4 == 0 {
        println!("number is divisible by 4");
    }
}

// 2.循环：loop
// 2.1 loop
// · 在 loop 中可以使用 break 关键字退出循环
fn loop_example() {
    let mut counter = 0;
    let result = loop {
        counter += 1;
        if counter == 10 {
            break counter * 2;
        }
    };
    println!("循环的结果是 {}", result);
}

// 2.2 while
// 每次循环开始之前都判断一次条件，如果满足则进行循环，否则退出
fn while_example() {
    let mut number = 3;
    while number != 0 {
        println!("{}!", number);
        number -= 1;
    }
    println!("LIFTOFF!!!");
}
// 2.3 for
// · 可以使用 while 或 loop 来遍历集合，但是易出错且低效
// · 使用 for 循环更简洁紧凑，可以针对集合中的每个元素来执行一些代码
fn for_example() {
    let a = [10,20,30,40,50];
    let mut index = 0;
    // 每次循环前都需要判断一次，所以比较低效
    while index < 5 {
        println!("the value is {}", a[index]);
        index += 1;
    }
    // for 循环示例
    for element in a.iter() {
        println!("for: the value is {}", element);
    }
}
// 2.4 Range
// · 标准库提供
// · 指定一个开始数字和一个结束数字， Range 可以生成它们之间的数字（左闭右开）
// · rev 方法可以反转 Range
fn range_example() {
    for number in (1..4).rev() {
        println!("{}!", number);
    }
    println!("LIFTOFF!!!");
}